package com.zkh.myutils.net.mail;

import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.Map.Entry;

import com.zkh.myutils.code.CoderUtils;
import com.zkh.myutils.io.log.Logger;
import com.zkh.myutils.net.ClientFactory;
import com.zkh.myutils.net.smtp.SMTPClient;
import com.zkh.myutils.utils.Utils;

/**
 * 邮件工具类。基于smtp
 * @author zkh
 */
public class MailUtils {
	
	/**
	 * 发送邮件，使用默认配置
	 * @param mailBean 邮件对象
	 */
	public static void sendMail(MailBean mailBean) throws IOException {
		sendMail(mailBean, ClientFactory.getSMTPClient());
	}
	
	/**
	 * 发送邮件
	 * @param mailBean 邮件对象
	 * @param username 帐号
	 * @param password 密码
	 * @param from 发件人
	 */
	public static void sendMail(MailBean mailBean, String username, String password, String from) throws IOException {
		sendMail(mailBean, ClientFactory.getSMTPClient(username, password, from));
	}
	
	/**
	 * 发送邮件
	 * @param mailBean 邮件对象
	 * @param hostname 主机
	 * @param port 端口
	 * @param username 帐号
	 * @param password 密码
	 * @param from 发件人
	 */
	public static void sendMail(MailBean mailBean, String hostname, int port, String username, String password, String from) throws IOException {
		sendMail(mailBean, ClientFactory.getSMTPClient(hostname, port, username, password, from));
	}
	
	/**
	 * 发送邮件
	 */
	private static void sendMail(MailBean mailBean, SMTPClient smtpClient) throws IOException {
		//检查收件人
		if(mailBean.getReceiverList().isEmpty()) {
			throw new IOException("收件人不能为空");
		}
		//初始化
		smtpClient.init();
		//发送DATA命令前准备
		smtpClient.sendDataBefore(mailBean.getReceivers());
		//开启数据传输
		if(smtpClient.sendData()) {
			//发件人
			String sender = "FROM: <" + smtpClient.getFrom() + ">";
			/** 开始发送内容 **/
			smtpClient.appendData(mailBean.getSubjectContent());	//主题
			smtpClient.appendData(sender);	//发件人
			smtpClient.appendData(mailBean.getReceiverContent());	//接收人
			//抄送密送
			String cc = mailBean.getCcContent();
			String bcc = mailBean.getBccContent();
			if(!cc.isEmpty()) {
				smtpClient.appendData(cc);
			}
			if(!bcc.isEmpty()) {
				smtpClient.appendData(bcc);
			}
			//版本号
			smtpClient.appendData("MIME-Version: 1.0");
			//分割符
			String separator = Utils.getUUID();
			//类型
			smtpClient.appendData("Content-Type: multipart/mixed;\r\n\tboundary=\"" + separator + "\"\r\n");
			//分割符
			smtpClient.appendData("--" + separator);
			//追加文本内容
			smtpClient.appendData(new MimePart(mailBean.getContent(), mailBean.isText()).toString(separator));
			//获取内嵌资源
			Map<String, MailSource> misMap = mailBean.getInlineSourceMap();
			//如果当前是HTML内容，则遍历内嵌资源
			if(!mailBean.isText()) {
				//遍历
				for(Entry<String, MailSource> kv: misMap.entrySet()) {
					//当前资源
					MailSource src = kv.getValue();
					//分隔符
					smtpClient.appendData("--" + separator);
					//指定类型
					smtpClient.appendData("Content-Type: " + src.getContentType());
					//指定编码
					smtpClient.appendData("Content-Transfer-Encoding: " + MimePart.BASE64);
					//指定内嵌
					smtpClient.appendData("Content-Disposition: inline");
					//内容ID
					smtpClient.appendData("Content-ID: " + src.getContentId());
					//拼接文件内容
					smtpClient.appendData("\r\n" + CoderUtils.encodeBase64(src.getInputStream()) + "\r\n");
				}
			}
			//遍历附件
			for(File file: mailBean.getAttachList()) {
				//分割符
				smtpClient.appendData("--" + separator);
				//追加附件
				smtpClient.appendData(new MimePart(file).toString(separator));
			}
			//遍历流附件
			for(MailSource mailSource: mailBean.getAttachStreamList()) {
				//分割符
				smtpClient.appendData("--" + separator);
				//追加附件
				smtpClient.appendData(new MimePart(mailSource.getInputStream(), mailSource.getFilename()).toString(separator));
			}
			//结束标识
			smtpClient.appendData("\r\n.");
			//获取响应
			if(!smtpClient.isSuccess()) {
				Logger.error("邮件发送失败");
			}
		}
		//退出登录
		smtpClient.logout();
		//断开连接
		smtpClient.disconnect();
	}
}
